#include "Bullet3Common/b3Vector3.h"
#ifdef __cplusplus
extern "C" {
#endif
b3Vector4* bullet_Newb3Vector4(){
	b3Vector4* wrap_out = new b3Vector4();
	return wrap_out;
}

b3Vector4* bullet_b3Vector4_absolute4(b3Vector4* c_this){
	b3Vector4 c_out = c_this->absolute4();
	b3Vector4* wrap_out = new b3Vector4(c_out);
	return wrap_out;
}

int bullet_b3Vector4_closestAxis4(b3Vector4* c_this){
	int c_out = c_this->closestAxis4();
	int wrap_out = (c_out);
	return wrap_out;
}

int bullet_b3Vector4_maxAxis4(b3Vector4* c_this){
	int c_out = c_this->maxAxis4();
	int wrap_out = (c_out);
	return wrap_out;
}

int bullet_b3Vector4_minAxis4(b3Vector4* c_this){
	int c_out = c_this->minAxis4();
	int wrap_out = (c_out);
	return wrap_out;
}

void bullet_b3Vector4_setValue(b3Vector4* c_this,float* _x,float* _y,float* _z,float* _w){
	b3Scalar const& c_arg__x=(b3Scalar const&)(*_x);
	b3Scalar const& c_arg__y=(b3Scalar const&)(*_y);
	b3Scalar const& c_arg__z=(b3Scalar const&)(*_z);
	b3Scalar const& c_arg__w=(b3Scalar const&)(*_w);
	c_this->setValue(c_arg__x,c_arg__y,c_arg__z,c_arg__w);
}

b3Vector3FloatData* bullet_Newb3Vector3FloatData(){
	b3Vector3FloatData* wrap_out = new b3Vector3FloatData();
	return wrap_out;
}

float** bullet_b3Vector3FloatData_GetFieldOfM_floats(b3Vector3FloatData* c_this){
	return (float**)(&c_this->m_floats);
}

b3Vector3DoubleData* bullet_Newb3Vector3DoubleData(){
	b3Vector3DoubleData* wrap_out = new b3Vector3DoubleData();
	return wrap_out;
}

double** bullet_b3Vector3DoubleData_GetFieldOfM_floats(b3Vector3DoubleData* c_this){
	return (double**)(&c_this->m_floats);
}

b3Vector3* bullet_Newb3Vector3(){
	b3Vector3* wrap_out = new b3Vector3();
	return wrap_out;
}

b3Vector3* bullet_b3Vector3_absolute(b3Vector3* c_this){
	b3Vector3 c_out = c_this->absolute();
	b3Vector3* wrap_out = new b3Vector3(c_out);
	return wrap_out;
}

float bullet_b3Vector3_angle(b3Vector3* c_this,b3Vector3* v){
	b3Vector3 const& c_arg_v=(b3Vector3 const&)(*v);
	b3Scalar c_out = c_this->angle(c_arg_v);
	float wrap_out = (c_out);
	return wrap_out;
}

int bullet_b3Vector3_closestAxis(b3Vector3* c_this){
	int c_out = c_this->closestAxis();
	int wrap_out = (c_out);
	return wrap_out;
}

b3Vector3* bullet_b3Vector3_cross(b3Vector3* c_this,b3Vector3* v){
	b3Vector3 const& c_arg_v=(b3Vector3 const&)(*v);
	b3Vector3 c_out = c_this->cross(c_arg_v);
	b3Vector3* wrap_out = new b3Vector3(c_out);
	return wrap_out;
}

void bullet_b3Vector3_deSerialize(b3Vector3* c_this,b3Vector3FloatData* dataIn){
	b3Vector3FloatData const& c_arg_dataIn=(b3Vector3FloatData const&)(*dataIn);
	c_this->deSerialize(c_arg_dataIn);
}

void bullet_b3Vector3_deSerializeDouble(b3Vector3* c_this,b3Vector3DoubleData* dataIn){
	b3Vector3DoubleData const& c_arg_dataIn=(b3Vector3DoubleData const&)(*dataIn);
	c_this->deSerializeDouble(c_arg_dataIn);
}

void bullet_b3Vector3_deSerializeFloat(b3Vector3* c_this,b3Vector3FloatData* dataIn){
	b3Vector3FloatData const& c_arg_dataIn=(b3Vector3FloatData const&)(*dataIn);
	c_this->deSerializeFloat(c_arg_dataIn);
}

float bullet_b3Vector3_distance(b3Vector3* c_this,b3Vector3* v){
	b3Vector3 const& c_arg_v=(b3Vector3 const&)(*v);
	b3Scalar c_out = c_this->distance(c_arg_v);
	float wrap_out = (c_out);
	return wrap_out;
}

float bullet_b3Vector3_distance2(b3Vector3* c_this,b3Vector3* v){
	b3Vector3 const& c_arg_v=(b3Vector3 const&)(*v);
	b3Scalar c_out = c_this->distance2(c_arg_v);
	float wrap_out = (c_out);
	return wrap_out;
}

float bullet_b3Vector3_dot(b3Vector3* c_this,b3Vector3* v){
	b3Vector3 const& c_arg_v=(b3Vector3 const&)(*v);
	b3Scalar c_out = c_this->dot(c_arg_v);
	float wrap_out = (c_out);
	return wrap_out;
}

b3Vector3* bullet_b3Vector3_dot3(b3Vector3* c_this,b3Vector3* v0,b3Vector3* v1,b3Vector3* v2){
	b3Vector3 const& c_arg_v0=(b3Vector3 const&)(*v0);
	b3Vector3 const& c_arg_v1=(b3Vector3 const&)(*v1);
	b3Vector3 const& c_arg_v2=(b3Vector3 const&)(*v2);
	b3Vector3 c_out = c_this->dot3(c_arg_v0,c_arg_v1,c_arg_v2);
	b3Vector3* wrap_out = new b3Vector3(c_out);
	return wrap_out;
}

int bullet_b3Vector3_furthestAxis(b3Vector3* c_this){
	int c_out = c_this->furthestAxis();
	int wrap_out = (c_out);
	return wrap_out;
}

bool bullet_b3Vector3_fuzzyZero(b3Vector3* c_this){
	bool c_out = c_this->fuzzyZero();
	bool wrap_out = (c_out);
	return wrap_out;
}

void bullet_b3Vector3_getSkewSymmetricMatrix(b3Vector3* c_this,b3Vector3* v0,b3Vector3* v1,b3Vector3* v2){
	b3Vector3 * c_arg_v0=(b3Vector3 *)(void*)(v0);
	b3Vector3 * c_arg_v1=(b3Vector3 *)(void*)(v1);
	b3Vector3 * c_arg_v2=(b3Vector3 *)(void*)(v2);
	c_this->getSkewSymmetricMatrix(c_arg_v0,c_arg_v1,c_arg_v2);
}

float* bullet_b3Vector3_getW(b3Vector3* c_this){
	b3Scalar const& c_out = c_this->getW();
	float* wrap_out = (float*)(&c_out);
	return wrap_out;
}

float* bullet_b3Vector3_getX(b3Vector3* c_this){
	b3Scalar const& c_out = c_this->getX();
	float* wrap_out = (float*)(&c_out);
	return wrap_out;
}

float* bullet_b3Vector3_getY(b3Vector3* c_this){
	b3Scalar const& c_out = c_this->getY();
	float* wrap_out = (float*)(&c_out);
	return wrap_out;
}

float* bullet_b3Vector3_getZ(b3Vector3* c_this){
	b3Scalar const& c_out = c_this->getZ();
	float* wrap_out = (float*)(&c_out);
	return wrap_out;
}

bool bullet_b3Vector3_isZero(b3Vector3* c_this){
	bool c_out = c_this->isZero();
	bool wrap_out = (c_out);
	return wrap_out;
}

float bullet_b3Vector3_length(b3Vector3* c_this){
	b3Scalar c_out = c_this->length();
	float wrap_out = (c_out);
	return wrap_out;
}

float bullet_b3Vector3_length2(b3Vector3* c_this){
	b3Scalar c_out = c_this->length2();
	float wrap_out = (c_out);
	return wrap_out;
}

b3Vector3* bullet_b3Vector3_lerp(b3Vector3* c_this,b3Vector3* v,float* t){
	b3Vector3 const& c_arg_v=(b3Vector3 const&)(*v);
	b3Scalar const& c_arg_t=(b3Scalar const&)(*t);
	b3Vector3 c_out = c_this->lerp(c_arg_v,c_arg_t);
	b3Vector3* wrap_out = new b3Vector3(c_out);
	return wrap_out;
}

int bullet_b3Vector3_maxAxis(b3Vector3* c_this){
	int c_out = c_this->maxAxis();
	int wrap_out = (c_out);
	return wrap_out;
}

int bullet_b3Vector3_maxDot(b3Vector3* c_this,b3Vector3* array,int array_count,float* dotOut){
	b3Vector3 const * c_arg_array=(b3Vector3 const *)(void*)(array);
	int c_arg_array_count=array_count;
	b3Scalar& c_arg_dotOut=(b3Scalar&)(*dotOut);
	int c_out = c_this->maxDot(c_arg_array,c_arg_array_count,c_arg_dotOut);
	int wrap_out = (c_out);
	return wrap_out;
}

int bullet_b3Vector3_minAxis(b3Vector3* c_this){
	int c_out = c_this->minAxis();
	int wrap_out = (c_out);
	return wrap_out;
}

int bullet_b3Vector3_minDot(b3Vector3* c_this,b3Vector3* array,int array_count,float* dotOut){
	b3Vector3 const * c_arg_array=(b3Vector3 const *)(void*)(array);
	int c_arg_array_count=array_count;
	b3Scalar& c_arg_dotOut=(b3Scalar&)(*dotOut);
	int c_out = c_this->minDot(c_arg_array,c_arg_array_count,c_arg_dotOut);
	int wrap_out = (c_out);
	return wrap_out;
}

b3Vector3* bullet_b3Vector3_normalize(b3Vector3* c_this){
	b3Vector3& c_out = c_this->normalize();
	b3Vector3* wrap_out = (b3Vector3*)(&c_out);
	return wrap_out;
}

b3Vector3* bullet_b3Vector3_normalized(b3Vector3* c_this){
	b3Vector3 c_out = c_this->normalized();
	b3Vector3* wrap_out = new b3Vector3(c_out);
	return wrap_out;
}

b3Vector3* bullet_b3Vector3_rotate(b3Vector3* c_this,b3Vector3* wAxis,float angle){
	b3Vector3 const& c_arg_wAxis=(b3Vector3 const&)(*wAxis);
	b3Scalar const c_arg_angle=angle;
	b3Vector3 c_out = c_this->rotate(c_arg_wAxis,c_arg_angle);
	b3Vector3* wrap_out = new b3Vector3(c_out);
	return wrap_out;
}

b3Vector3* bullet_b3Vector3_safeNormalize(b3Vector3* c_this){
	b3Vector3& c_out = c_this->safeNormalize();
	b3Vector3* wrap_out = (b3Vector3*)(&c_out);
	return wrap_out;
}

void bullet_b3Vector3_serialize(b3Vector3* c_this,b3Vector3FloatData* dataOut){
	b3Vector3FloatData& c_arg_dataOut=(b3Vector3FloatData&)(*dataOut);
	c_this->serialize(c_arg_dataOut);
}

void bullet_b3Vector3_serializeDouble(b3Vector3* c_this,b3Vector3DoubleData* dataOut){
	b3Vector3DoubleData& c_arg_dataOut=(b3Vector3DoubleData&)(*dataOut);
	c_this->serializeDouble(c_arg_dataOut);
}

void bullet_b3Vector3_serializeFloat(b3Vector3* c_this,b3Vector3FloatData* dataOut){
	b3Vector3FloatData& c_arg_dataOut=(b3Vector3FloatData&)(*dataOut);
	c_this->serializeFloat(c_arg_dataOut);
}

void bullet_b3Vector3_setInterpolate3(b3Vector3* c_this,b3Vector3* v0,b3Vector3* v1,float rt){
	b3Vector3 const& c_arg_v0=(b3Vector3 const&)(*v0);
	b3Vector3 const& c_arg_v1=(b3Vector3 const&)(*v1);
	b3Scalar c_arg_rt=rt;
	c_this->setInterpolate3(c_arg_v0,c_arg_v1,c_arg_rt);
}

void bullet_b3Vector3_setMax(b3Vector3* c_this,b3Vector3* other){
	b3Vector3 const& c_arg_other=(b3Vector3 const&)(*other);
	c_this->setMax(c_arg_other);
}

void bullet_b3Vector3_setMin(b3Vector3* c_this,b3Vector3* other){
	b3Vector3 const& c_arg_other=(b3Vector3 const&)(*other);
	c_this->setMin(c_arg_other);
}

void bullet_b3Vector3_setValue(b3Vector3* c_this,float* _x,float* _y,float* _z){
	b3Scalar const& c_arg__x=(b3Scalar const&)(*_x);
	b3Scalar const& c_arg__y=(b3Scalar const&)(*_y);
	b3Scalar const& c_arg__z=(b3Scalar const&)(*_z);
	c_this->setValue(c_arg__x,c_arg__y,c_arg__z);
}

void bullet_b3Vector3_setW(b3Vector3* c_this,float _w){
	b3Scalar c_arg__w=_w;
	c_this->setW(c_arg__w);
}

void bullet_b3Vector3_setX(b3Vector3* c_this,float _x){
	b3Scalar c_arg__x=_x;
	c_this->setX(c_arg__x);
}

void bullet_b3Vector3_setY(b3Vector3* c_this,float _y){
	b3Scalar c_arg__y=_y;
	c_this->setY(c_arg__y);
}

void bullet_b3Vector3_setZ(b3Vector3* c_this,float _z){
	b3Scalar c_arg__z=_z;
	c_this->setZ(c_arg__z);
}

void bullet_b3Vector3_setZero(b3Vector3* c_this){
	c_this->setZero();
}

float bullet_b3Vector3_triple(b3Vector3* c_this,b3Vector3* v1,b3Vector3* v2){
	b3Vector3 const& c_arg_v1=(b3Vector3 const&)(*v1);
	b3Vector3 const& c_arg_v2=(b3Vector3 const&)(*v2);
	b3Scalar c_out = c_this->triple(c_arg_v1,c_arg_v2);
	float wrap_out = (c_out);
	return wrap_out;
}

#ifdef __cplusplus
}
#endif
